# -*- coding: utf-8 -*-
from copy import deepcopy

class Domino(object):
    """ Représente un couple de valeurs jouant le rôle d’un domino. """
    def __init__(self, x, y):
        """ Construit un domino avec les valeurs (x, y) ou x et y sont
        compris entre 0 et 6 (inclus), sinon lève ValueError. """
        if x in range(7) and y in range(7):
            self.x = x
            self.y = y
        else:
            raise ValueError("Les parametres doivent être 0 <= x <= 6")
    def inverse(self):
        """ Inverse les valeurs du domino """
        self.x, self.y = self.y, self.x
    def __str__(self):
        return "[%d|%d]" % (self.x, self.y)
    def __repr__(self):
        return "Domino(%d, %d)" % (self.x, self.y)
    def estCompatible(self, other):
        if isinstance(other, Domino):
            return self.y == other.x
        else:
            raise TypeError('Invalid type')
    def estConciliable(self, other):
        if isinstance(other, Domino):
            return (self.y==other.x) or (self.y==other.y)
        else:
            raise TypeError('Invalid type')
    @staticmethod
    def suite_dominos(sac, premier):
        if not sac:
            #print "cas de base"
            return [premier]
        else:
            #print "entre s=", sac, "p=", premier
            for i, d in enumerate(sac):
                if premier.estConciliable(d):
                    #print premier, "conciliable avec", d
                    if not premier.estCompatible(d):
                        d.inverse()
                    nv_sac = deepcopy(sac)
                    nv_sac = nv_sac[:i] + nv_sac[i+1:]
                    #print u"appel récursif"
                    r = Domino.suite_dominos(nv_sac, d)
                    if r != None:
                        return [premier] + r
            return None

sac = [Domino(1,4), Domino(1,2), Domino(5,2), Domino(3,4)]
deb = Domino(4,5)
print Domino.suite_dominos(sac, deb)
